#ifndef JATEK_H_INCLUDED
#define JATEK_H_INCLUDED
#include <iostream>
#include <fstream>
#include <cstdlib>

enum Exception {TERKEP_HIBA, KASZT_HIBA, MENTES_HIBA};

class Karakter {
    int tamadas, tamadasp, vedelem, vedelemp, sebzes, sebzesp, tpszint, tp;
    std::string tamadasnev[3], nev;
public:
    Karakter(const std::string& s): tamadas(0), tpszint(1), tp(0), nev(s) {}
    int getSzint() const { return tp/tpszint; }
    int getTamadas() const { return tamadas+tamadasp*getSzint(); }
    int getVedelem() const { return vedelem+vedelemp*getSzint(); }
    int getSebzes() const { return sebzes+sebzesp*getSzint(); }
    std::string getTnev(int a) const { return tamadasnev[a]; }
    void tpszerzes(int szerzett);
    void beolvas();
    int betolt();
    void ment(int kuldetesvektor);
};

class Kuldetes {
protected:
    int tp, szintmin;
    bool kesz;
public:
    virtual void vegrehajt(Karakter& karakter) =0;
    bool getKesz() const { return kesz; }
    int getTp() const { return tp; }
    int getSzintmin() const { return szintmin; }
    virtual void beolvas(std::ifstream& fin, int& kuldetesvektor) =0;
    virtual ~Kuldetes() {}
};

class Harc: public Kuldetes {
    int etamadas, evedelem, esebzes;
    std::string ellenfel;
public:
    void vegrehajt(Karakter& karakter);
    void beolvas(std::ifstream& fin, int& kuldetesvektor);
};

class Fejtoro: public Kuldetes {
    std::string kerdes, jo, rossz;
    int valasz;
public:
    void vegrehajt(Karakter& karakter);
    void beolvas(std::ifstream& fin, int& kuldetesvektor);
};

class Mezo {
    Mezo* bal, *jobb, *hat;
    Kuldetes* kuldi;
    std::string szovege, szovegu;
public:
    Mezo(): bal(NULL), jobb(NULL), hat(NULL), kuldi(NULL) {}
    Mezo* getBal() const { return bal; }
    Mezo* getJobb() const { return jobb; }
    Mezo* getHat() const { return hat; }
    bool kuldetesez(Karakter& karakter);
    void kuldikesz(int& kuldetesvektor);
    void szovegki();
    void beolvas(std::ifstream& fin, int melyseg, int& kuldetesvektor);
    ~Mezo() { if(bal!=NULL) delete bal; if(jobb!=NULL) delete jobb; if(kuldi!=NULL) delete kuldi;}
};


class Terkep {
    Mezo* hely;
public:
    bool balra();
    bool jobbra();
    bool hatra();
    int kuldikesz();
    void szovegki() { hely->szovegki(); }
    bool kuldetesez(Karakter& karakter) { return hely->kuldetesez(karakter); }
    void beolvas(std::ifstream& fin, int& a);
    Terkep(): hely(NULL) {}
    ~Terkep();
};

class Vezerlo {
    Terkep terkep;
    Karakter* karakter;
    int kuldeteshatra;
    void ment();
public:
    void fut();
    Vezerlo(Karakter* k, std::ifstream& fin, int kuldetesvektor);
    ~Vezerlo() { if(karakter!=NULL) delete karakter; }
};

char beker(const std::string& s);
bool be(std::ifstream& fin, int& beolvasando);

#endif // JATEK_H_INCLUDED
